import gpio
import os
import i2c


class BH1750:
    """
    BH1750 数字光照传感器驱动类，用于读取环境光强度(单位: lux)

    通信接口: I2C
    默认地址: 0x23 (ADDR引脚接地时)
    """
    # 设备I2C地址及读写命令
    bh1750_addr = 0x23  # BH1750 默认I2C地址
    write_cmd = (bh1750_addr << 1) | 0x00  # I2C写命令(LSB=0)
    read_cmd = (bh1750_addr << 1) | 0x01  # I2C读命令(LSB=1)

    def __init__(self):
        """初始化BH1750传感器，配置GPIO为I2C功能"""
        # 配置SDA引脚(物理引脚0)
        gpio.gpio_init(0)  # 初始化GPIO0
        func = gpio.query_func_value(0, 'I2C1_SDA')  # 查询I2C1_SDA功能值
        gpio.set_func(0, func)  # 设置GPIO0为I2C1_SDA功能

        # 配置SCL引脚(物理引脚1)
        gpio.gpio_init(1)  # 初始化GPIO1
        func = gpio.query_func_value(1, 'I2C1_SCL')  # 查询I2C1_SCL功能值
        gpio.set_func(1, func)  # 设置GPIO1为I2C1_SCL功能

    def read(self):
        """读取当前光照强度值(单位: lux)"""
        # 从传感器读取2字节数据
        r, d = i2c.read(1, self.read_cmd, 2)

        # 数据处理: 转换为lux值
        if r == 0:  # 读取成功
            # 合并两个字节数据并根据数据手册公式计算光照值
            d = (((d[0] << 8) + d[1]) / 1.2)

        return d

    def open(self):
        """初始化I2C接口并启动传感器测量"""
        r = 0
        # 初始化I2C1接口，设置时钟频率为400kHz
        r += i2c.i2c_init(1, 400000)

        # 发送Power ON命令(0x01): 激活传感器
        r += i2c.write(1, self.write_cmd, [0x01])

        # 发送Continuous H-Resolution Mode命令(0x10):
        # 以1lx分辨率连续测量，测量时间约120ms
        r += i2c.write(1, self.write_cmd, [0x10])

        # return r  # 取消注释可返回初始化状态码

    def close(self):
        """关闭传感器并释放I2C资源"""
        i2c.i2c_deinit(1)  # 禁用I2C1接口